import java.util.*;

/*
维护一个集合，支持如下几种操作：
I x，插入一个数 x；
Q x，询问数 x是否在集合中出现过；
现在要进行 N次操作，对于每个询问操作输出对应的结果。

输入格式
第一行包含整数 N，表示操作数量。
接下来 N行，每行包含一个操作指令，操作指令为 I x，Q x 中的一种。

输出格式
对于每个询问指令 Q x，输出一个询问结果，如果 x 在集合中出现过，则输出 Yes，否则输出 No。
每个结果占一行。

数据范围
1≤N≤1e5  −1e9≤x≤1e9

输入样例：
5
I 1
I 2
I 3
Q 2
Q 5

输出样例：
Yes
No
 */
//public class Main {
//    public static void main(String[] args) {
//        Scanner sc = new Scanner(System.in);
//        HashSet<Integer> hset = new HashSet<>();
//        int n = sc.nextInt();
//        while (n-- > 0) {
//            String op = sc.next();
//            if (op.equals("I")) {
//                hset.add(sc.nextInt());
//            } else if (op.equals("Q")) {
//                if (hset.contains(sc.nextInt())) {
//                    System.out.println("Yes");
//                } else {
//                    System.out.println("No");
//                }
//            }
//        }
//    }
//}

/*
给定一个长度为 n的字符串，再给定 m个询问，每个询问包含四个整数 l1,r1,l2,r2，请你判断 [l1,r1]和 [l2,r2]这两个区间所包含的字符串子串是否完全相同。
字符串中只包含大小写英文字母和数字。

输入格式
第一行包含整数 n和 m，表示字符串长度和询问次数。
第二行包含一个长度为 n的字符串，字符串中只包含大小写英文字母和数字。
接下来 m行，每行包含四个整数 l1,r1,l2,r2，表示一次询问所涉及的两个区间。
注意，字符串的位置从 1开始编号。

输出格式
对于每个询问输出一个结果，如果两个字符串子串完全相同则输出 Yes，否则输出 No。
每个结果占一行。

数据范围
1≤n,m≤1e5

输入样例：
8 3
aabbaabb
1 3 5 7
1 3 6 8
1 2 1 2

输出样例：
Yes
No
Yes
 */

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(), m = sc.nextInt();
        String s = sc.next();
        while (m-- > 0) {
            if (s.substring(sc.nextInt() - 1, sc.nextInt()).hashCode() == s.substring(sc.nextInt() - 1, sc.nextInt()).hashCode())
                System.out.println("Yes");
            else System.out.println("No");
        }
    }
}



